﻿#region Copyright

// The contents of this file are subject to the Mozilla Public License
//  Version 1.1 (the "License"); you may not use this file except in compliance
//  with the License. You may obtain a copy of the License at
//  
//  http://www.mozilla.org/MPL/
//  
//  Software distributed under the License is distributed on an "AS IS"
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
//  License for the specific language governing rights and limitations under 
//  the License.
//  
//  The Initial Developer of the Original Code is Robert Smyth.
//  Portions created by Robert Smyth are Copyright (C) 2008.
//  
//  All Rights Reserved.

#endregion

using System;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.Win32;
using NUnitGrid.Framework.Pipes;
using NUnitGrid.Protocol;
using NUnitGrid.Protocol.Responses;


namespace NUnitGrid.ProxyServer.Protocol
{
    public class ReadInfoCommandHandler : IProtocolCommandHandler
    {
        private readonly INodeInfo nodeInfo;
        private readonly IPipe pipe;

        public ReadInfoCommandHandler(IPipe pipe, INodeInfo nodeInfo)
        {
            this.pipe = pipe;
            this.nodeInfo = nodeInfo;
        }

        public bool CanHandle(string commandMessage)
        {
            return commandMessage.StartsWith("Command.Read.Info(");
        }

        public void Handle(string commandMessage)
        {
            var parser = new ProtocolMessageParser(commandMessage);

            var response = new ProtocolAppResponseMessage("Read.Info", parser.GetTransactionID());
            response.AddProperty("MachineName", Environment.MachineName);
            response.AddProperty("ProcessorCount", Environment.ProcessorCount);
            response.AddProperty("ProcessorSpeedMHz", GetProcessorSpeed());
            response.AddProperty("SoftwareVersion", Assembly.GetExecutingAssembly().GetName().Version.ToString());
            response.AddProperty("NickName", nodeInfo.Nickname);

            pipe.SendMessage(response.ToString());
        }

        private static int GetProcessorSpeed()
        {
            int cpuPowerMHz;
            using (var lockMachineKey = Registry.LocalMachine)
            {
                var centralProcessorKey =
                    lockMachineKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");
                cpuPowerMHz = int.Parse(centralProcessorKey.GetValue("~MHz").ToString());
            }
            return cpuPowerMHz;
        }
    }
}